package me.szlx.thing.parser;

import me.szlx.thing.Thing;
import me.szlx.thing.ThingException;
import me.szlx.thing.bundle.ThingBundle;

import java.io.InputStream;

public interface ThingParser<T extends Thing> {
    /**
     * 获取流中全部资源的列表。如果流为{@code null}或不包含任何资源，则返回空的列表。
     *
     * @param resource 资源流。
     * @return 流中全部资源的列表。如果流为{@code null}或不包含任何资源，则返回空的列表。
     */
    ThingBundle<T> parse(InputStream resource);

    static <T extends Thing> ThingParser<T> getParser(ThingParserConfig parserConfig) {
        if (parserConfig == null) {
            throw new ThingException("资源解析器配置不能为null");
        }
        String format = parserConfig.getFormat();
        if ("yml".equalsIgnoreCase(format) || "yaml".equalsIgnoreCase(format)) {
            YamlThingParser<T> theParser = new YamlThingParser<>();
            theParser.setThingCreator(parserConfig.getThingCreator());
            theParser.setTraitCreator(parserConfig.getTraitCreator());
            theParser.setPrefix(parserConfig.getPrefix());
            return theParser;
        } else if ("properties".equalsIgnoreCase(format)) {
            PropertiesThingParser<T> theParser = new PropertiesThingParser<>();
            theParser.setThingCreator(parserConfig.getThingCreator());
            theParser.setTraitCreator(parserConfig.getTraitCreator());
            theParser.setPrefix(parserConfig.getPrefix());
            return theParser;
        } else if ("conf".equalsIgnoreCase(format) || "json".equalsIgnoreCase(format)) {
            TypesafeConfigParser<T> theParser = new TypesafeConfigParser<>();
            theParser.setThingCreator(parserConfig.getThingCreator());
            theParser.setTraitCreator(parserConfig.getTraitCreator());
            theParser.setPrefix(parserConfig.getPrefix());
            return theParser;
        }
        throw new ThingException("不是识别的资源格式：" + parserConfig.getFormat());
    }
}
